using System;
using UnityEngine;
using UnityEngine.UI;
using Random = UnityEngine.Random;

public class EE_UI_Build : MonoBehaviour
{
    private static EE_UI_Build instance; public static EE_UI_Build Instance {get{return instance;}}

    [SerializeField] private GameObject elements;
    public RectTransform buttonConfirm = null;
    public RectTransform buttonCancel = null;

    private void Awake()
    {
        instance = this;
        elements = transform.GetChild(0).gameObject;
        buttonConfirm = elements.transform.GetChild(0).GetComponent<RectTransform>();
        buttonCancel = elements.transform.GetChild(1).GetComponent<RectTransform>();
        elements.SetActive(false);
    }

    private void Start()
    {
        buttonConfirm.gameObject.GetComponent<Button>().onClick.AddListener(Confirm);
        buttonCancel.gameObject.GetComponent<Button>().onClick.AddListener(Cancel);
    }

    /* 确认建造 */
    private void Confirm()
    {
        if (EE_Building_Controller.Instance != null && 
            EE_UI_Main.Instance.grid.CanPlaceBuilding(EE_Building_Controller.Instance, EE_Building_Controller.Instance.CurrentX, EE_Building_Controller.Instance.CurrentY))
        {
            if (EE_Building_Controller.Instance.IsConfirmed)
            {/* 修改建筑的网格位置 */
                // todo: 更新[数据库-建筑表]该建筑的网格位置
                // 隐藏按钮
                SetStatus(false);
                Debug.Log("确认-修改建筑位置");
            }
            else
            {/* 新增建筑 */
                // todo： 发送建筑及位置信息 保存到 服务器
                // todo： 服务器需要检查该位置 是否允许 放置建筑
                // todo： 数据库-建筑表-新增建筑
                bool isSuccess = true;
                if (isSuccess)
                {/* 数据库新增建筑成功 */
                    // 隐藏 X和V 按钮、
                    SetStatus(false);
                    EE_Building_Controller.Instance.IsConfirmed = true;
                    // 添加 数据库-建筑信息
                    EE_Data.Building b = new EE_Data.Building();
                    b.tableId = Random.Range(1, 1000);
                    b.id = EE_Building_Controller.Instance.id;
                    b.level = 1;
                    b.x = EE_Building_Controller.Instance.CurrentX;
                    b.y = EE_Building_Controller.Instance.CurrentY;
                    b.rows = EE_Building_Controller.Instance.Rows;
                    b.cols = EE_Building_Controller.Instance.Cols;
                    b.storage = 0;
                    b.capacity = 500;
                    b.boost = DateTime.Now;
                    b.constructing = true;
                    int[] randSeconds = new[] { 12, 62, 4800, 3600*24+12 };
                    b.upgradeCostSeconds = randSeconds[Random.Range(0, 4)];// 随机数建造时长
                    b.constructionTime = DateTime.Now.AddSeconds(b.upgradeCostSeconds);
                    EE_Building_Controller.Instance.data = b;
                    // 设置建筑升级进度条
                    EE_Building_Controller.Instance.buildBar = Instantiate(EE_UI_Main.Instance.buildBar, EE_UI_Main.Instance.buttonsParent);
                    EE_Building_Controller.Instance.buildBar.building = EE_Building_Controller.Instance;
                    // 根据不同建筑类型 初始化 按钮
                    switch (EE_Building_Controller.Instance.id)
                    {
                        case EE_Data.BuildingID.townhall:
                            break;
                        case EE_Data.BuildingID.goldmine:
                            // 添加 金币收集 按钮
                            EE_Building_Controller.Instance.collectButton = Instantiate(
                                EE_UI_Main.Instance.buttonCollectGold,
                                EE_UI_Main.Instance.buttonsParent);
                            EE_Building_Controller.Instance.collectButton.button.onClick.AddListener(EE_Building_Controller.Instance.Collect);
                            break;
                        case EE_Data.BuildingID.goldstorage:
                            break;
                        case EE_Data.BuildingID.elixer:
                            break;
                        case EE_Data.BuildingID.elixerstorage:
                            break;
                        default:
                            throw new ArgumentOutOfRangeException();
                    }
                    // 添加建筑到列表
                    EE_UI_Main.Instance.grid.buildings.Add(EE_Building_Controller.Instance);
                    Debug.Log("确认-新增建筑");
                }
            }
        }
    }

    public void Cancel()
    {
        if (EE_Building_Controller.Instance != null)
        {
            if (EE_Building_Controller.Instance.IsConfirmed)
            {/* 取消建筑的移动, 让建筑回到原位置 */
                Vector3 position = EE_UI_Main.Instance.grid.GetCenterPosition(
                    EE_Building_Controller.Instance.x, EE_Building_Controller.Instance.y, 
                    EE_Building_Controller.Instance.Rows, EE_Building_Controller.Instance.Cols
                    );
                EE_Building_Controller.Instance.transform.position = position;
                // 建筑回到原位置后, 当前的currentX和currentY要重置
                EE_Building_Controller.Instance.CurrentX = EE_Building_Controller.Instance.x;
                EE_Building_Controller.Instance.CurrentY = EE_Building_Controller.Instance.y;
                // 隐藏按钮
                SetStatus(false);
                Debug.Log("取消-建筑移动");
            }
            else
            {/* 取消新建筑的建造 */
                EE_Building_Controller.Instance.RemoveFromGrid();
                Debug.Log("取消-新增建筑");
            }
        }
    }
    
    public void SetStatus(bool status)
    {
        elements.SetActive(status);
    }

    private void Update()
    {
        if (EE_Building_Controller.Instance != null && EE_MainCamera_Controller.Instance.isPlacingBuilding)
        {
            // 利用 建筑(右上角)的网格坐标 获得 世界坐标
            Vector3 end = EE_UI_Main.Instance.grid.GetEndPosition(EE_Building_Controller.Instance);
            // 屏幕左下角和屏幕右上角 在平面上的坐标
            Vector3 planeDownLeft = EE_MainCamera_Controller.Instance.CameraScreenPositionToPlanePosition(Vector2.zero);
            Vector3 planeTopRight = EE_MainCamera_Controller.Instance.CameraScreenPositionToPlanePosition(new Vector2(Screen.width, Screen.height));
            // 计算屏幕在世界坐标上的宽度和高度
            float w = planeTopRight.x - planeDownLeft.x;
            float h = planeTopRight.z - planeDownLeft.z;
            // 建筑(右上角)相对于屏幕(平面坐标)左下角 在3d空间中的偏移
            float endW = end.x - planeDownLeft.x;
            float endH = end.z - planeDownLeft.z;
            // 建筑(右上角)在屏幕上 的位置
            Vector2 screenPoint = new Vector2(endW/w * Screen.width, endH/h * Screen.height);
            // X和V按钮 在屏幕上的位置 (需要将X和V按钮的锚点位置设为左下角),todo：鼠标移动速度太快会让 按钮的跟随 跟不上
            Vector2 confirmPoint = screenPoint;
            confirmPoint.x += (3*buttonConfirm.rect.width + 10);
            buttonConfirm.anchoredPosition = confirmPoint;
            
            Vector2 cancelPoint = screenPoint;
            cancelPoint.x -= (buttonCancel.rect.width);
            buttonCancel.anchoredPosition = cancelPoint;
        }
    }
}